import re
import sys
import argparse
from pathlib import Path


class TextCounter:
    """文本计数器类 - 完整功能"""

    def __init__(self, file_path):
        """初始化计数器"""
        self.file_path = file_path
        try:
            with open(file_path, 'r', encoding='utf-8') as file:
                self.content = file.read()
                self.lines = self.content.splitlines()
        except FileNotFoundError:
            print(f"错误：文件 {file_path} 不存在")
            sys.exit(1)
        except Exception as e:
            print(f"错误：读取文件时发生错误 - {e}")
            sys.exit(1)

    def count_chars(self):
        """统计字符数（包括空格和换行符）"""
        return len(self.content)

    def count_chars_no_whitespace(self):
        """统计字符数（不包括空格和换行符）"""
        return len(re.sub(r'\s', '', self.content))

    def count_words(self):
        """统计单词数"""
        # 使用正则表达式匹配单词（字母序列）
        words = re.findall(r'\b[a-zA-Z]+\b', self.content)
        return len(words)

    def count_sentences(self):
        """统计句子数"""
        # 以 . ! ? 作为句子结束标志
        sentences = re.split(r'[.!?]+', self.content)
        # 过滤空字符串
        sentences = [s.strip() for s in sentences if s.strip()]
        return len(sentences)

    def count_lines(self):
        """统计总行数"""
        return len(self.lines)

    def count_code_lines(self):
        """统计代码行（非空行）"""
        return sum(1 for line in self.lines if line.strip())

    def count_empty_lines(self):
        """统计空行"""
        return sum(1 for line in self.lines if not line.strip())

    def count_comment_lines(self):
        """统计注释行"""
        comment_count = 0
        # 简单的注释检测（支持 #, // 风格的注释）
        for line in self.lines:
            stripped_line = line.strip()
            if stripped_line.startswith(('#', '//')):
                comment_count += 1
        return comment_count


def main():
    """主函数"""
    parser = argparse.ArgumentParser(
        description='WordCount 文本计数统计程序 (v0.3 - 完整功能)',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog='''
使用示例:
  python wc.py -c file.txt      统计字符数
  python wc.py -w file.txt      统计单词数  
  python wc.py -s file.txt      统计句子数
  python wc.py -l file.txt      统计代码行数
  python wc.py -e file.txt      统计空行数
  python wc.py -m file.txt      统计注释行数
  python wc.py -a file.txt      显示所有统计信息
        '''
    )

    parser.add_argument('file', help='要统计的文本文件')
    parser.add_argument('-c', '--chars', action='store_true',
                        help='统计字符数（包括空格）')
    parser.add_argument('-C', '--chars-no-space', action='store_true',
                        help='统计字符数（不包括空格）')
    parser.add_argument('-w', '--words', action='store_true',
                        help='统计单词数')
    parser.add_argument('-s', '--sentences', action='store_true',
                        help='统计句子数')
    parser.add_argument('-l', '--lines', action='store_true',
                        help='统计代码行数（非空行）')
    parser.add_argument('-e', '--empty', action='store_true',
                        help='统计空行数')
    parser.add_argument('-m', '--comments', action='store_true',
                        help='统计注释行数')
    parser.add_argument('-a', '--all', action='store_true',
                        help='显示所有统计信息')

    args = parser.parse_args()

    # 检查文件是否存在
    if not Path(args.file).exists():
        print(f"错误：文件 {args.file} 不存在")
        sys.exit(1)

    # 创建计数器实例
    counter = TextCounter(args.file)

    # 根据参数显示统计结果
    if args.all:
        print(f"文件: {args.file}")
        print(f"字符数 (包括空格): {counter.count_chars()}")
        print(f"字符数 (不包括空格): {counter.count_chars_no_whitespace()}")
        print(f"单词数: {counter.count_words()}")
        print(f"句子数: {counter.count_sentences()}")
        print(f"总行数: {counter.count_lines()}")
        print(f"代码行数: {counter.count_code_lines()}")
        print(f"空行数: {counter.count_empty_lines()}")
        print(f"注释行数: {counter.count_comment_lines()}")
    else:
        output = []
        if args.chars:
            output.append(f"字符数 (包括空格): {counter.count_chars()}")
        if args.chars_no_space:
            output.append(f"字符数 (不包括空格): {counter.count_chars_no_whitespace()}")
        if args.words:
            output.append(f"单词数: {counter.count_words()}")
        if args.sentences:
            output.append(f"句子数: {counter.count_sentences()}")
        if args.lines:
            output.append(f"代码行数: {counter.count_code_lines()}")
        if args.empty:
            output.append(f"空行数: {counter.count_empty_lines()}")
        if args.comments:
            output.append(f"注释行数: {counter.count_comment_lines()}")

        # 如果没有指定任何参数，显示帮助信息
        if not output:
            parser.print_help()
        else:
            for line in output:
                print(line)


if __name__ == '__main__':
    main()